home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 286_01 / equiv.c < prev    next >
Text File  |  1989-05-23  |  5KB  |  278 lines

  1. #include <stdio.h>
  2. #include <dos.h>
  3. #include <gds.h>
  4.  
  5. /*
  6. int far *calcaddr(x,y)
  7. int x,y;
  8. {
  9.   long tloc;
  10.   int temp;
  11.  
  12.   tloc = (y & 0x01) ? 0xba000000L : 0xb8000000L;
  13.   temp = y >> 1;
  14.   tloc += (temp << 4) + (temp << 6) + ((x >> 3) & 0xfffe);
  15.   return ( (int far *) tloc );
  16. }  
  17.  
  18. set_text()
  19. {
  20.   union REGS inregs;
  21.   union REGS outregs;
  22.  
  23.   inregs.h.al = 2;
  24.   inregs.h.ah = 0;
  25.   int86(0x10,&inregs,&outregs);
  26. }
  27.  
  28. set_graph()
  29. {
  30.   union REGS inregs;
  31.   union REGS outregs;
  32.  
  33.   inregs.h.al = 6;
  34.   inregs.h.ah = 0;
  35.   int86(0x10,&inregs,&outregs);
  36. }
  37. */
  38.  
  39. dot(x,y)
  40. int x,y;
  41. {
  42.   int far *addr;
  43.  
  44.   addr=calcaddr(x,y);
  45.   fr_write(addr,DOTVALUE[x & 0x0f]);
  46. }
  47.  
  48. vertline(x,y,length)
  49. int x,y,length;
  50. {
  51.   int far *addr, far *downline();
  52.   unsigned int pword;
  53.   int loop;
  54.  
  55.   addr=calcaddr(x,y);
  56.   LASTY=y;
  57.   pword=DOTVALUE[x & 0x0f];
  58.   while (length-- > 0) {
  59.     fr_write(addr,pword);
  60.     addr=downline(addr);
  61.     }
  62. }
  63.  
  64. horzline(x,y,length)
  65. int x,y,length;
  66. {
  67.   int far *addr;
  68.   unsigned int pword;
  69.   int len,loop;
  70.  
  71.   addr=calcaddr(x,y);
  72.   len = (x & 0x0f) + length;
  73.   if (len <= 16) {
  74.     pword=LEFTWORD[x & 0x0f] ^ LEFTWORD[len];
  75.     fr_write(addr,pword);
  76.     return;
  77.     }
  78.   fr_write(addr,LEFTWORD[x & 0x0f]);
  79.   addr++;
  80.   for (loop=len >> 4; loop > 1; loop--,addr++)
  81.     fr_write(addr,0xffff);
  82.   fr_write(addr,RIGHTWORD[len & 0x0f]);
  83. }
  84.  
  85. circle_pt(ctrx,ctry,x,y)
  86. int ctrx,ctry,x,y;
  87. {
  88.   dot(x+ctrx,y+ctry);
  89.   dot(y+ctrx,x+ctry);
  90.   dot(y+ctrx,-x+ctry);
  91.   dot(x+ctrx,-y+ctry);
  92.   dot(-x+ctrx,-y+ctry);
  93.   dot(-y+ctrx,-x+ctry);
  94.   dot(-y+ctrx,x+ctry);
  95.   dot(-x+ctrx,y+ctry);
  96. }
  97.  
  98. circle(centerx,centery,radius)
  99. int centerx,centery,radius;
  100.   int x,y,d, incr1, incr2;
  101.  
  102.   x=0;
  103.   y=radius;
  104.   incr1=6;
  105.   incr2=10-(radius<<2);
  106.   d=3-(radius<<1);
  107.   while (x < y) {
  108.     circle_pt(centerx,centery,x++,y);
  109.     if (d<0) {
  110.         d+=incr1;
  111.         incr2+=4;
  112.     } else {
  113.         d+=incr2;
  114.         incr2+=8;
  115.         y--;
  116.     }
  117.     incr1+=4;
  118.   }
  119.   if (x==y) circle_pt(centerx,centery,x,y);
  120. }
  121.  
  122. ellipse_pt(ctrx,ctry,x,y)
  123. int ctrx,ctry,x,y;
  124. {
  125.   dot(x+ctrx,y+ctry);
  126.   dot(x+ctrx,-y+ctry);
  127.   dot(-x+ctrx,-y+ctry);
  128.   dot(-x+ctrx,y+ctry);
  129. }
  130.  
  131. ellipse(ctrx,ctry,a,b)
  132. int ctrx,ctry,a,b;
  133. {
  134.   long incr1,incr2,a2,b2,d,step1,step2,ptx,pty;
  135.   int x,y;
  136.  
  137.   x=0;
  138.   y=b;
  139.   a2= (long) a * a;
  140.   b2= (long) b * b;
  141.   step1 = a2 << 2;
  142.   step2 = b2 << 2;
  143.   d= ((b2 - (a2 * b)) << 1) + a2;
  144.   incr1= step2 + (b2 << 1);
  145.   incr2= step1 + step2 + (b2 << 1) - ((a2 * b) << 2);
  146.   ptx=0;
  147.   pty=a2 * y;
  148.   while (ptx < pty) {
  149.     ellipse_pt(ctrx,ctry,x++,y);
  150.     if (d<0)
  151.       d+=incr1;
  152.     else {
  153.       d+=incr2;
  154.       incr2+=step1;
  155.       y--;
  156.       pty-=a2;
  157.       }
  158.     ptx+=b2;
  159.     incr1+=step2;
  160.     incr2+=step2;
  161.     }
  162.   if (ptx == pty) ellipse_pt(ctrx,ctry,x,y);
  163.   y=0;
  164.   x=a;
  165.   d= ((a2 - (b2 * a)) << 1) + b2;
  166.   incr1= step1 + (a2 << 1);
  167.   incr2= step2 + step1 + (a2 << 1) - ((b2 * a) << 2);
  168.   pty=0;
  169.   ptx=b2 * x;
  170.   while (pty < ptx) {
  171.     ellipse_pt(ctrx,ctry,x,y++);
  172.     if (d<0)
  173.       d+=incr1;
  174.     else {
  175.       d+=incr2;
  176.       incr2+=step2;
  177.       x--;
  178.       ptx-=b2;
  179.       }
  180.     pty+=a2;
  181.     incr1+=step1;
  182.     incr2+=step1;
  183.     }
  184.   if (ptx==pty) ellipse_pt(ctrx,ctry,x,y);
  185. }
  186.  
  187. line(x1,y1,x2,y2)
  188. int x1,y1,x2,y2;
  189. {
  190.   int dx,dy,d,x,y,xend,yend,len,incr1,incr2,xdir,ydir,dir;
  191.  
  192.   xdir=ydir=0;
  193.   if ((dx=x2-x1) < 0) { dx = -dx; xdir=(-1); }
  194.   if ((dy=y2-y1) < 0) { dy = -dy; ydir=(-1); }
  195.   if (dx == 0) {
  196.     if (xdir)
  197.       vertline(x1,y2,++dy);
  198.     else
  199.       vertline(x1,y1,++dy);
  200.     }
  201.   if (dy == 0) {
  202.     if (ydir)
  203.       horzline(x1,y2,++dx);
  204.     else
  205.       horzline(x1,y1,++dx);
  206.     }
  207.   if ((xdir==(-1)) && (ydir==(-1)))
  208.     dir=1;
  209.   else if (xdir || ydir)
  210.     dir=xdir+ydir;
  211.   else
  212.     dir=1;
  213.   if (dy <= dx) {
  214.     d = (dy << 1) - dx;
  215.     incr1 = dy << 1;
  216.     incr2 = (dy - dx) << 1;
  217.     if (xdir) {
  218.       x=x2; y=y2; xend=x1;
  219.       }
  220.     else {
  221.       x=x1; y=y1; xend=x2;
  222.       }
  223.     len=1;
  224.     while (x++<xend) {
  225.       if (d<0) {
  226.         d+=incr1;
  227.         len++;
  228.         }
  229.       else {
  230.         horzline(x-len,y,len);
  231.         len=1;
  232.         d+=incr2;
  233.         y+=dir;
  234.         }
  235.       }
  236.     horzline(x-len,y,len);
  237.     }
  238.   else {
  239.     d = (dx << 1) - dy;
  240.     incr1 = dx << 1;
  241.     incr2 = (dx - dy) << 1;
  242.     if (ydir) {
  243.       x=x2; y=y2; yend=y1;
  244.       }
  245.     else {
  246.       x=x1; y=y1; yend=y2;
  247.       }
  248.     len=1;
  249.     while (y++<yend) {
  250.       if (d<0) {
  251.         d+=incr1;
  252.         len++;
  253.         }
  254.       else {
  255.         vertline(x,y-len,len);
  256.         len=1;
  257.         d+=incr2;
  258.         x+=dir;
  259.         }
  260.       }
  261.     vertline(x,y-len,len);
  262.     }
  263. }
  264.  
  265. main()
  266. {
  267.     setgraph();
  268.     horzline(0,0,640);
  269.     vertline(0,0,200);
  270.     line(0,0,639,199);
  271.     circle(320,100,90);
  272.     ellipse(320,100,300,95);
  273.     getch();
  274.     settext();
  275. }
  276.  
  277.